1 Install Packages

## [1] "C:/Users/jonat/OneDrive - Oregon Health & Science University/Nelson Lab/Bioinformatics/Nelson/JGA Dissection"

2 Objective

The goal of this file is to compare the transcriptional profile of our Contractile cell dataset (INTACT) with Humphrey’s (DKD) as well as creating figures accordingly.

3 Load INTACT Dataset (Collected)

Th

SO.INTACT <- readRDS(here("Datasets", "INTACT_JGA.rds"))
DimPlot(SO.INTACT, group.by = "class.JGA")

4 Load DKD Dataset

SO.DKD <- readRDS(here("Datasets","DKD_JGA_2.rds"))

SO.DKD@meta.data$class.JGA <- factor(SO.DKD@meta.data$class.JGA, levels = c("Pericyte", "Efferent VSMC", "Afferent VSMC", "Granular Cell", "EG Mesangial Cell", "IG Mesangial Cell"))

Idents(SO.DKD) <- SO.DKD@meta.data$class.JGA

DimPlot(SO.DKD, group.by = "class.JGA")

5 ForLoop INTACT DEG Lists

markers_result <- list()

clusters <- unique(SO.INTACT$class.JGA)

for (i in clusters) {
  
  # Replace spaces with underscores in cluster names
  clean_name <- gsub(" ", "_", i)
  
  # Find markers for the cluster
  markers <- FindMarkers(SO.INTACT, ident.1 = i, group.by = "class.JGA", min.pct = 0.1, logfc.threshold = 0.25)
  markers <- markers %>%
    rownames_to_column(var = "gene") %>%
    arrange(desc(avg_log2FC))
  
  markers_result[[clean_name]] <- markers
  
  # Create variable name without spaces
  var_name <- paste0(clean_name, ".INTACT.markers") 
  assign(var_name, markers, envir = .GlobalEnv)

}

6 ForLoop DKD DEG Lists

markers_result <- list()

clusters <- unique(SO.DKD$class.JGA)


for (i in clusters) {
  
  clean_name <- gsub(" ", "_", i)
  
  markers <- FindMarkers(SO.DKD, ident.1 = i, group.by = "class.JGA", min.pct = 0.1, logfc.threshold = 0.25)
  markers <- markers %>%
    rownames_to_column(var = "gene") %>%
    arrange(desc(avg_log2FC))
  
  markers_result[[clean_name]] <- markers
  
  var_name <- paste0(clean_name, ".DKD.markers") 
  assign(var_name, markers, envir = .GlobalEnv)

}

7 Name Lists

INTACT_list <- list(`Pericyte.INTACT.markers`, `Granular_Cell.INTACT.markers`, `Efferent_VSMC.INTACT.markers`, `Afferent_VSMC.INTACT.markers`, `IG_Mesangial_Cell.INTACT.markers`, `EG_Mesangial_Cell.INTACT.markers`)


DKD_list <- list(`Pericyte.DKD.markers`, `Granular_Cell.DKD.markers`, `Efferent_VSMC.DKD.markers`, `Afferent_VSMC.DKD.markers`, `IG_Mesangial_Cell.DKD.markers`, `EG_Mesangial_Cell.DKD.markers`)


names(INTACT_list) <- c("Pericyte.INTACT.markers", "Granular Cell.INTACT.markers", "Efferent VSMC.INTACT.markers", "Afferent VSMC.INTACT.markers", "IG_Mesangial_Cell.INTACT.markers", "EG_Mesangial_Cell.INTACT.markers")


names(DKD_list) <- c("Pericyte.DKD.markers", "Granular Cell.DKD.markers", "Efferent VSMC.DKD.markers", "Afferent VSMC.DKD.markers", "IG_Mesangial_Cell.DKD.markers", "EG_Mesangial_Cell.DKD.markers")

8 Scatterplot Forloop + R-squared Table

library(dplyr)
library(ggplot2)
library(ggrepel)
library(broom)

# Initialize table for storing R-squared values and slopes
rsq_table <- data.frame(matrix(ncol = 7, nrow = (length(INTACT_list) * length(DKD_list))))
names(rsq_table) <- c("INTACT", "DKD", "R-squared", "Slope", "Shared_DEGs", "INTACT_UniqueDEGs", "DKD_UniqueDEGs")

# List to store scatterplots
scatterplots <- list()

## START FOR {LOOP} LEVEL 1 ##
for (i in 1:length(INTACT_list)) {
  
  x.markers <- INTACT_list[[i]]
  x.markers_tb <- x.markers %>%
    data.frame() %>%
    as_tibble()
  
  ## START FOR {LOOP} LEVEL 2 ##
  for (j in 1:length(DKD_list)) {
    y.markers <- DKD_list[[j]]
    y.markers_tb <- y.markers %>%
      data.frame() %>%
      as_tibble()
    
    # X-Y DEGs Intersection Table
    xy.comp <- inner_join(x.markers_tb, y.markers_tb, by = "gene")

    # Ensure enough genes exist for regression
    if(nrow(xy.comp) > 1) { 
      
      # Selecting only relevant columns
      xy.comp.R2 <- xy.comp %>%
        dplyr::select(avg_log2FC.x, avg_log2FC.y)
      
      # Correct regression model
      model <- lm(avg_log2FC.y ~ avg_log2FC.x, data = xy.comp.R2)
      
      # Extract slope and correct R² calculation
      slope <- coef(model)["avg_log2FC.x"]
      n_rsq <- summary(model)$r.squared

    } else {
      slope <- NA
      n_rsq <- NA  # Not enough data for a valid regression
    }

    # Calculate DEGs counts
    Shared_DEGs <- nrow(xy.comp)
    INTACT_UniqueDEGs <- nrow(x.markers_tb) - Shared_DEGs
    DKD_UniqueDEGs <- nrow(y.markers_tb) - Shared_DEGs

    # Add to R-squared table
    index <- ((i-1) * length(DKD_list)) + j
    rsq_table[index, 1] = names(INTACT_list)[i]
    rsq_table[index, 2] = names(DKD_list)[j]
    rsq_table[index, 3] = n_rsq
    rsq_table[index, 4] = slope  # Adding the slope to the table
    rsq_table[index, 5] = Shared_DEGs
    rsq_table[index, 6] = INTACT_UniqueDEGs
    rsq_table[index, 7] = DKD_UniqueDEGs

    # Generate Scatterplot for each pair
    p <- ggplot(xy.comp, aes(x = avg_log2FC.x, y = avg_log2FC.y, label = gene)) +
      geom_point(color = "#636EFA", alpha = 0.6, size = 2.5) +  # Blue dots with transparency
      geom_smooth(method = "lm", color = "#1E90FF", linetype = "dashed", se = FALSE) + # Best-fit regression line
      geom_text_repel(size = 4, segment.size = 0.2, segment.color = "grey50") +  # Gene labels
      annotate("text", x = min(xy.comp$avg_log2FC.x) + 0.2, 
               y = max(xy.comp$avg_log2FC.y) - 0.2, 
               label = paste0("R² = ", round(n_rsq, 3), "\nSlope = ", round(slope, 3)), 
               color = "black", size = 6, hjust = 0) +
      labs(
        title = paste(names(INTACT_list)[i], "vs", names(DKD_list)[j]),
        x = paste("avg_log2FC -", names(INTACT_list)[i]),
        y = paste("avg_log2FC -", names(DKD_list)[j])
      ) +
      theme_minimal(base_size = 14) +
      theme(
        plot.title = element_text(hjust = 0.5, face = "bold"),
        axis.title = element_text(face = "bold"),
        axis.line = element_line(color = "black", size = 1),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank()
      )

    # Store the plot
    scatterplots[[paste(names(INTACT_list)[i], names(DKD_list)[j], sep = "_vs_")]] <- p
  }
}

# Sort and print the R-squared table
rsq_table <- rsq_table %>%
  arrange(desc(`R-squared`))

print(rsq_table)
##                              INTACT                           DKD   R-squared
## 1  EG_Mesangial_Cell.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.871103144
## 2      Afferent VSMC.INTACT.markers     Afferent VSMC.DKD.markers 0.831108036
## 3           Pericyte.INTACT.markers          Pericyte.DKD.markers 0.819735997
## 4      Granular Cell.INTACT.markers     Granular Cell.DKD.markers 0.803212088
## 5  IG_Mesangial_Cell.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.790047831
## 6      Efferent VSMC.INTACT.markers     Efferent VSMC.DKD.markers 0.740028411
## 7  EG_Mesangial_Cell.INTACT.markers     Efferent VSMC.DKD.markers 0.668672011
## 8      Granular Cell.INTACT.markers          Pericyte.DKD.markers 0.572604083
## 9  IG_Mesangial_Cell.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.557736118
## 10 IG_Mesangial_Cell.INTACT.markers     Efferent VSMC.DKD.markers 0.506863175
## 11     Efferent VSMC.INTACT.markers     Afferent VSMC.DKD.markers 0.487814621
## 12 EG_Mesangial_Cell.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.457213186
## 13 EG_Mesangial_Cell.INTACT.markers          Pericyte.DKD.markers 0.425512588
## 14     Afferent VSMC.INTACT.markers          Pericyte.DKD.markers 0.387082095
## 15 EG_Mesangial_Cell.INTACT.markers     Afferent VSMC.DKD.markers 0.353406675
## 16 IG_Mesangial_Cell.INTACT.markers          Pericyte.DKD.markers 0.287329245
## 17     Efferent VSMC.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.262102769
## 18          Pericyte.INTACT.markers     Afferent VSMC.DKD.markers 0.261196606
## 19          Pericyte.INTACT.markers     Granular Cell.DKD.markers 0.241584735
## 20     Efferent VSMC.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.238386314
## 21     Afferent VSMC.INTACT.markers     Efferent VSMC.DKD.markers 0.225720449
## 22 IG_Mesangial_Cell.INTACT.markers     Afferent VSMC.DKD.markers 0.224455302
## 23     Afferent VSMC.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.140584991
## 24 IG_Mesangial_Cell.INTACT.markers     Granular Cell.DKD.markers 0.129146376
## 25     Afferent VSMC.INTACT.markers     Granular Cell.DKD.markers 0.120158331
## 26     Afferent VSMC.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.114777945
## 27     Efferent VSMC.INTACT.markers     Granular Cell.DKD.markers 0.107575604
## 28     Granular Cell.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.099035788
## 29          Pericyte.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.051841561
## 30     Granular Cell.INTACT.markers     Efferent VSMC.DKD.markers 0.045815585
## 31 EG_Mesangial_Cell.INTACT.markers     Granular Cell.DKD.markers 0.044447753
## 32     Efferent VSMC.INTACT.markers          Pericyte.DKD.markers 0.037701620
## 33     Granular Cell.INTACT.markers     Afferent VSMC.DKD.markers 0.033103424
## 34     Granular Cell.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.019218548
## 35          Pericyte.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.011062189
## 36          Pericyte.INTACT.markers     Efferent VSMC.DKD.markers 0.002267001
##          Slope Shared_DEGs INTACT_UniqueDEGs DKD_UniqueDEGs
## 1   0.64593200         204               362             42
## 2   0.70783676         287               341             72
## 3   0.71401987         202               277             52
## 4   0.61906713         123               295             47
## 5   0.63214061         271               406             64
## 6   0.98000380         158               164            112
## 7  -0.55062972         197               369             73
## 8  -0.63758145         163               255             91
## 9   0.51479711         172               505             74
## 10 -0.46010826         193               484             77
## 11  0.95219681         150               172            209
## 12  0.50500260         199               367            136
## 13 -0.43600727         177               389             77
## 14 -0.43483557         183               445             71
## 15 -0.45347778         203               363            156
## 16 -0.35500413         174               503             80
## 17 -0.60172637         121               201            125
## 18 -0.49057073         222               257            137
## 19 -0.36132974         107               372             63
## 20 -0.58295270         132               190            203
## 21  0.35584419         167               461            103
## 22 -0.34999748         223               454            136
## 23 -0.29142463         185               443            150
## 24 -0.20509699         117               560             53
## 25  0.22736398         115               513             55
## 26 -0.23841491         163               465             83
## 27  0.38830168          85               237             85
## 28  0.27007920         114               304            132
## 29 -0.19738412         151               328             95
## 30 -0.18095187         126               292            144
## 31 -0.13125073         114               452             56
## 32 -0.22216557         136               186            118
## 33  0.16305872         150               268            209
## 34 -0.13001383         136               282            199
## 35 -0.10447415         165               314            170
## 36  0.04213346         153               326            117
# Display all scatterplots
for (plot_name in names(scatterplots)) {
  print(scatterplots[[plot_name]])
}

9 Create HeatMap of Datasets

df <- rsq_table %>%
                dplyr::select(INTACT, DKD, "R-squared") %>%
                mutate(INTACT = sub("_Named_", " ", INTACT)) %>%
                mutate(DKD = sub("_Named_", " ", DKD)) %>%
                pivot_wider(names_from = DKD, values_from = "R-squared") %>%
                column_to_rownames(var = "INTACT") %>%
                as.matrix()


library(corrplot)
## Correlation Plot
corrplot(df, method = 'color')

DimPlot(SO.INTACT, group.by = "class.JGA")

10 Specific Marker Expression

11 Figures

11.1 First Panel

p1 <- DimPlot(SO.DKD)  + 
  ylab("UMAP 2") +
  xlab("UMAP 1") +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 20),
    axis.line = element_line(size = 1, colour = "black"),
    axis.text = element_blank(),          # Remove axis text
    axis.ticks = element_blank(),         # Optional: Remove axis ticks
    text = element_text(size = 20)
  ) + ggtitle("UMAP - DKD Contractile Clusters") 


p2 <- DimPlot(SO.INTACT, reduction = "umap", group.by = "class.JGA") + 
  ylab("UMAP 2") +
  xlab("UMAP 1") +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 20),
    axis.line = element_line(size = 1, colour = "black"),
    axis.text = element_blank(),          # Remove axis text
    axis.ticks = element_blank(),         # Optional: Remove axis ticks
    text = element_text(size = 20)
  ) + ggtitle("UMAP - INTACT Contractile Clusters") 

print(p1)

print(p2)

11.2 Panel 2

library(patchwork)

library(ggplot2)
library(patchwork)

Idents(SO.DKD) <- SO.DKD@meta.data$class.JGA
Idents(SO.INTACT) <- SO.INTACT@meta.data$class.JGA

Idents(SO.DKD) <- SO.DKD@meta.data$class.JGA
Idents(SO.INTACT) <- SO.INTACT@meta.data$class.JGA


markers.to.plot <- c("Nkain2", 
                     "Col23a1", # Adora1 didn't look good 
                     "Ren1", 
                     "Hpse2", 
                     "Tenm2", 
                     "Tshz2")



#cluster_order <- c("Pericyte", "Efferent VSMC", "Afferent VSMC", "Granular Cell", "EG Mesangial Cell", "IG Mesangial Cell")

#SO.DKD@meta.data$class.JGA <- factor(SO.DKD@meta.data$class.JGA, levels = cluster_order)


p3 <- DotPlot(SO.DKD, features = markers.to.plot) +
  coord_flip() +
  ggtitle("Gene Expression Across Clusters - DKD") + 
  xlab("Clusters") + ylab("Marker Genes") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 14, face = "bold", hjust = 0.5))

p4 <- DotPlot(SO.INTACT, features = markers.to.plot) +
  coord_flip() +
  ggtitle("Gene Expression Across Clusters - INTACT") + 
  xlab("Clusters") + ylab("Marker Genes") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 14, face = "bold", hjust = 0.5))

p3

p4

11.3 Panel 3

xy.comp <- inner_join(Pericyte.INTACT.markers, Pericyte.DKD.markers, by = "gene")

df.upper <- subset(xy.comp, avg_log2FC.x > 1 & avg_log2FC.y > 1)
df.lower <- subset(xy.comp, avg_log2FC.x < -1 & avg_log2FC.y < -1)

model <- lm(avg_log2FC.y ~ avg_log2FC.x, data = xy.comp)

slope <- coef(model)["avg_log2FC.x"]
r_squared <- summary(model)$r.squared



library(ggplot2)
library(ggrepel)

xy.comp <- inner_join(IG_Mesangial_Cell.INTACT.markers, IG_Mesangial_Cell.DKD.markers, by = "gene")

p5 <- ggplot(xy.comp, aes(x = avg_log2FC.x, y = avg_log2FC.y, label = gene)) +
  
  geom_point(color = "#636EFA", alpha = 0.6, size = 2.5) + 
  
  geom_point(data = df.upper, color = "#EF553B", size = 3.5) + 
  geom_point(data = df.lower, color = "#00CC96", size = 3.5) + 
  geom_smooth(method = "lm", color = "#1E90FF", linetype = "dashed", se = FALSE) +
  
  geom_text_repel(data = rbind(df.upper, df.lower), segment.size = 0.2, segment.color = "grey50", 
                  size = 5) +
    annotate("text", x = min(xy.comp$avg_log2FC.x) + 0.2, 
           y = max(xy.comp$avg_log2FC.y) - 0.2, 
           label = paste0("R² = ", round(r_squared, 3), "\nSlope = ", round(slope, 3)), 
           color = "black", size = 6, hjust = 0) +

  
  labs(
    title = "Intraglomerular Mesangial Gene Expression: INTACT vs DKD",
    x = "Average log2FC - INTACT IG Mesangial",
    y = "Average log2FC - DKD IG Mesangial"
  ) +
  
  theme_minimal(base_size = 16) + 
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.title = element_text(face = "bold"), 
    axis.line = element_line(color = "black", size = 1),  
    panel.grid.major = element_blank(),  
    panel.grid.minor = element_blank()  
  )


p5

11.4 Panel 4

library(dplyr)
library(tidyr)
library(ggplot2)
library(reshape2)
library(RColorBrewer)

rsq_table <- rsq_table %>%
  mutate(
    INTACT = gsub("\\.", " ", INTACT),
    DKD = gsub("\\.", " ", DKD),
    INTACT = gsub("INTACT markers", "", INTACT), 
    DKD = gsub("DKD markers", "", DKD),
    INTACT = gsub("_", " ", INTACT),
    DKD = gsub("_", " ", DKD)
  )

df <- rsq_table %>%
  dplyr::select(INTACT, DKD, `R-squared`) %>%
  pivot_wider(names_from = DKD, values_from = `R-squared`) %>%
  column_to_rownames(var = "INTACT") %>%
  as.matrix()

cor_long <- melt(df)

p6 <- ggplot(cor_long, aes(x = Var1, y = Var2, fill = value)) +
  
  geom_tile(color = "white", size = 0.3) +
  
  geom_text(aes(label = sprintf("%.2f", value)), size = 5, fontface = "bold",
            color = ifelse(cor_long$value > 0.5, "white", "black")) + 
  
  scale_fill_gradientn(colors = rev(brewer.pal(9, "RdBu")), 
                       limits = c(0, 1), name = "R²") +
  
  theme_minimal(base_size = 16) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 14, face = "bold", color = "black"),
    axis.text.y = element_text(size = 14, face = "bold", color = "black"),
    axis.title = element_text(size = 16, face = "bold"),
    panel.grid = element_blank(),  # No distracting grid lines
    legend.position = "right",
    legend.title = element_text(size = 14, face = "bold"),
    legend.text = element_text(size = 12),
    plot.title = element_text(size = 20, face = "bold", hjust = 0.5)
  ) +
  
  labs(title = "Correlation of Contractile Cell Clusters (INTACT vs DKD)",
       x = "DKD Clusters",
       y = "INTACT Clusters")

p6

## JWN Coding

# Define the desired order
cor_long$Var1 <- trimws(cor_long$Var1)
cor_long$Var2 <- trimws(cor_long$Var2)

# Convert Var1 and Var2 into ordered factors
cor_long$Var1 <- factor(cor_long$Var1, levels = c("Pericyte", "Efferent VSMC", "Afferent VSMC", 
                                                  "Granular Cell", "EG Mesangial Cell", "IG Mesangial Cell"))
cor_long$Var2 <- factor(cor_long$Var2, levels = c("Pericyte", "Efferent VSMC", "Afferent VSMC", 
                                                  "Granular Cell", "EG Mesangial Cell", "IG Mesangial Cell"))

# Plot
p6 <- ggplot(cor_long, aes(x = Var2, y = Var1, fill = value)) + 
  geom_tile(color = "white", size = 0.3) + 
  geom_text(aes(label = sprintf("%.2f", value)), size = 5, fontface = "bold",
            color = ifelse(cor_long$value > 0.5, "white", "black")) + 
  scale_fill_gradientn(colors = rev(brewer.pal(9, "RdBu")), 
                       limits = c(0, 1), name = "R²") +
  theme_minimal(base_size = 16) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 14, face = "bold", color = "black"),
    axis.text.y = element_text(size = 14, face = "bold", color = "black"),
    axis.title = element_text(size = 16, face = "bold"),
    panel.grid = element_blank(),
    legend.position = "right",
    legend.title = element_text(size = 14, face = "bold"),
    legend.text = element_text(size = 12),
    plot.title = element_text(size = 20, face = "bold", hjust = 0.5)
  ) +
  labs(title = "Correlation between INTACT vs DKD",
       x = "DKD Clusters",
       y = "INTACT Clusters") +
  coord_fixed(ratio = .5)

p6

12 Final Figure

p1

p2

p3

p4

p5

p6

13 Session Info

sessionInfo()
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 22631)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=English_United States.utf8 
## [2] LC_CTYPE=English_United States.utf8   
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.utf8    
## 
## time zone: America/Los_Angeles
## tzcode source: internal
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] RColorBrewer_1.1-3  reshape2_1.4.4      corrplot_0.92      
##  [4] broom_1.0.5         ggrepel_0.9.5       ggvenn_0.1.10      
##  [7] gplots_3.2.0        gridExtra_2.3       sjmisc_2.8.9       
## [10] openxlsx_4.2.5.2    lubridate_1.9.2     forcats_1.0.0      
## [13] stringr_1.5.1       purrr_1.0.2         readr_2.1.5        
## [16] tidyr_1.3.1         tibble_3.2.1        tidyverse_2.0.0    
## [19] devtools_2.4.5      usethis_2.2.2       here_1.0.1         
## [22] ggpmisc_0.5.4-1     ggpp_0.5.4          BiocManager_1.30.22
## [25] ggplot2_3.5.1       knitr_1.45          patchwork_1.2.0    
## [28] SeuratObject_5.0.1  Seurat_4.4.0        dplyr_1.1.4        
## 
## loaded via a namespace (and not attached):
##   [1] RcppAnnoy_0.0.22       splines_4.3.1          later_1.3.1           
##   [4] bitops_1.0-7           polyclip_1.10-6        lifecycle_1.0.4       
##   [7] rprojroot_2.0.4        globals_0.16.2         processx_3.8.2        
##  [10] lattice_0.21-8         MASS_7.3-60            insight_0.19.5        
##  [13] backports_1.4.1        magrittr_2.0.3         limma_3.56.2          
##  [16] plotly_4.10.4          sass_0.4.9             rmarkdown_2.25        
##  [19] jquerylib_0.1.4        yaml_2.3.7             remotes_2.5.0         
##  [22] httpuv_1.6.11          sctransform_0.4.1      spam_2.10-0           
##  [25] zip_2.3.0              sp_2.1-3               sessioninfo_1.2.2     
##  [28] pkgbuild_1.4.2         spatstat.sparse_3.0-3  reticulate_1.34.0     
##  [31] cowplot_1.1.3          pbapply_1.7-2          abind_1.4-5           
##  [34] pkgload_1.3.3          Rtsne_0.17             irlba_2.3.5.1         
##  [37] listenv_0.9.1          spatstat.utils_3.0-4   MatrixModels_0.5-3    
##  [40] goftest_1.2-3          spatstat.random_3.2-2  fitdistrplus_1.1-11   
##  [43] parallelly_1.36.0      leiden_0.4.3.1         codetools_0.2-19      
##  [46] tidyselect_1.2.1       farver_2.1.1           matrixStats_1.2.0     
##  [49] spatstat.explore_3.2-5 jsonlite_1.8.8         ellipsis_0.3.2        
##  [52] progressr_0.14.0       ggridges_0.5.6         survival_3.5-5        
##  [55] tools_4.3.1            ica_1.0-3              Rcpp_1.0.12           
##  [58] glue_1.8.0             mgcv_1.8-42            xfun_0.40             
##  [61] withr_3.0.2            fastmap_1.1.1          fansi_1.0.4           
##  [64] SparseM_1.81           caTools_1.18.2         callr_3.7.3           
##  [67] digest_0.6.33          timechange_0.2.0       R6_2.5.1              
##  [70] mime_0.12              colorspace_2.1-0       scattermore_1.2       
##  [73] gtools_3.9.5           tensor_1.5             spatstat.data_3.0-4   
##  [76] utf8_1.2.3             generics_0.1.3         data.table_1.14.10    
##  [79] prettyunits_1.2.0      httr_1.4.7             htmlwidgets_1.6.4     
##  [82] uwot_0.1.16            pkgconfig_2.0.3        gtable_0.3.6          
##  [85] lmtest_0.9-40          htmltools_0.5.8.1      profvis_0.3.8         
##  [88] dotCall64_1.1-1        scales_1.3.0           png_0.1-8             
##  [91] rstudioapi_0.15.0      tzdb_0.4.0             nlme_3.1-162          
##  [94] cachem_1.0.8           zoo_1.8-12             sjlabelled_1.2.0      
##  [97] KernSmooth_2.23-21     parallel_4.3.1         miniUI_0.1.1.1        
## [100] pillar_1.9.0           vctrs_0.6.5            RANN_2.6.1            
## [103] urlchecker_1.0.1       promises_1.2.1         xtable_1.8-4          
## [106] cluster_2.1.4          evaluate_0.23          cli_3.6.1             
## [109] compiler_4.3.1         rlang_1.1.5            crayon_1.5.2          
## [112] future.apply_1.11.1    labeling_0.4.3         ps_1.7.5              
## [115] plyr_1.8.9             fs_1.6.5               stringi_1.7.12        
## [118] viridisLite_0.4.2      deldir_2.0-2           munsell_0.5.1         
## [121] lazyeval_0.2.2         spatstat.geom_3.2-8    quantreg_5.97         
## [124] Matrix_1.6-5           hms_1.1.3              future_1.33.1         
## [127] shiny_1.8.0            highr_0.10             ROCR_1.0-11           
## [130] igraph_1.6.0           memoise_2.0.1          bslib_0.8.0           
## [133] polynom_1.4-1